package org.deep.cmd;

/**
 * 所有指令类的基类
 *
 * @param <T> 指令解析返回的类型
 */
public abstract class BaseCmd<T> {
    /**
     * 接受一个完整的指令，数据的长度
     */
    public final int receiveSize;

    protected BaseCmd(int receiveSize) {
        this.receiveSize = receiveSize;
    }

    /**
     * 定义如何解析数据
     * @param buf 需要解析的数据
     * @return 返回解析指令的结果
     */
    protected abstract T handle(byte[] buf);

    /**
     * 定义如何校验返回的数据
     * @param buf 需要校验的数据
     * @return 返回校验是否通过
     */
    protected abstract boolean check(byte[] buf);


    /**
     * 计算和校验值
     * @param buf 需要计算和校验的数据
     * @return 返回计算的和校验值
     */
    public static byte calcSumValue(byte[] buf) {
        byte sumValue = 0x00;
        for (int i = 0; i < buf.length - 1; i++) {
            if (i == buf.length - 1) {
                break;
            }
            sumValue = (byte) (sumValue + buf[i]);
        }
        return sumValue;
    }

    /**
     * 和校验
     * @param buf 需要和校验的数据
     * @return 返回是否通过和校验
     */
    public static boolean sumCheck(byte[] buf) {
        return calcSumValue(buf) == buf[buf.length - 1];
    }
}
